package function;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class AdjacencyMatrix {
	private int[][] matrix;//矩阵存储为二维数组
	//构造方法，只传入一个整形参数，因为构造的矩阵行数和列数相同
	public AdjacencyMatrix(int l) {
		//矩阵的行数和列数都为l
		matrix=new int[l][l];
		for(int i=0;i<l;i++) {
			for(int j=0;j<l;j++) {
				if(i==j) {
					this.set(i, j, 0);//将矩阵对角线初始化为0
				} else {
					this.set(i, j, 32767);//除对角线外的其他元素初始化为32767
				}
			}
		}
	}
	public int get(int i,int j) {
		return matrix[i][j];
	}
	
	public void set(int i,int j,int distance) {
		matrix[i][j]=distance;
	}
	/*create方法用于ScenicsMatrix类构建景区景点分布图
	 * 一次循环填充邻接矩阵的两个位置，构建出两个景点间的两条边（无向图）
	 */
	public void create() {
		// 创建文件工厂实例，获取DOM解析器工厂，用于解析xml文件
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 如果创建的解析器在解析XML文档时必须删除元素内容中的空格，则为true，否则为false
		dbf.setIgnoringElementContentWhitespace(true);
		Scenic scenic=new Scenic();
		//保存边信息的xml文件路径
		String xmlPath = "edge.xml";
		
		try {
			//创建文件对象
			DocumentBuilder db = dbf.newDocumentBuilder();// 创建解析器，解析XML文档
			Document doc = db.parse(xmlPath); // 使用dom解析xml文件
			
			//遍历列表，进行XML文件的数据提取
			// 根据节点名称来获取所有相关的节点
			NodeList sonlist = doc.getElementsByTagName("edge");
			for (int i = 0; i < sonlist.getLength(); i++) // 循环处理对象
			{
				// 节点属性的处理
				Element son = (Element) sonlist.item(i);
				NodeList elements1 = son.getElementsByTagName("distance");
				NodeList elements2 = son.getElementsByTagName("scenic1");
				NodeList elements3 = son.getElementsByTagName("scenic2");
				Node node1 = elements1.item(0);
				Node node2 = elements2.item(0);
				Node node3 = elements3.item(0);
				if (node1.getNodeType() == Node.ELEMENT_NODE && node2.getNodeType() == Node.ELEMENT_NODE&& node3.getNodeType() == Node.ELEMENT_NODE) {
					String value1 = node1.getFirstChild().getNodeValue();
					String value2 = node2.getFirstChild().getNodeValue();
					String value3 = node3.getFirstChild().getNodeValue();
					int d=Integer.parseInt(value1);
					int s1=scenic.findNumberByName(value2);
					int s2=scenic.findNumberByName(value3);
					//由于是无向边，输入一条边时构建两条边
					set(s1,s2,d);
					set(s2,s1,d);
				}
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}
